"""
日志配置
"""
import logging
import os
import sys
from logging.handlers import RotatingFileHandler
from datetime import datetime

# 确保控制台输出使用UTF-8编码
if hasattr(sys.stdout, 'reconfigure'):
    sys.stdout.reconfigure(encoding='utf-8')
if hasattr(sys.stderr, 'reconfigure'):
    sys.stderr.reconfigure(encoding='utf-8')

# 设置环境变量确保UTF-8编码
os.environ['PYTHONIOENCODING'] = 'utf-8'

class UTF8Formatter(logging.Formatter):
    """UTF-8编码的日志格式化器"""
    
    def format(self, record):
        # 先调用父类的format方法
        msg = super().format(record)
        
        # 确保在Windows上正确处理中文编码
        if os.name == 'nt':
            try:
                # 尝试用UTF-8编码再解码
                msg = msg.encode('utf-8').decode('utf-8')
            except (UnicodeEncodeError, UnicodeDecodeError):
                # 如果失败，使用错误处理方式
                msg = msg.encode('utf-8', errors='replace').decode('utf-8', errors='replace')
        
        return msg

class ColoredFormatter(UTF8Formatter):
    """彩色日志格式化器"""
    
    # ANSI颜色码
    COLORS = {
        'DEBUG': '\033[36m',    # 青色
        'INFO': '\033[32m',     # 绿色
        'WARNING': '\033[33m',  # 黄色
        'ERROR': '\033[31m',    # 红色
        'CRITICAL': '\033[35m', # 紫色
    }
    RESET = '\033[0m'  # 重置颜色

    def format(self, record):
        # 添加颜色
        if hasattr(sys.stderr, 'isatty') and sys.stderr.isatty():
            levelname = record.levelname
            if levelname in self.COLORS:
                record.levelname = f"{self.COLORS[levelname]}{levelname}{self.RESET}"
        
        return super().format(record)

def setup_logging(log_level=None):
    """设置日志配置
    
    Args:
        log_level: 日志级别，默认从配置文件读取
    """
    # 创建日志目录
    log_dir = os.path.join(os.path.dirname(__file__), '..', '..', 'logs')
    os.makedirs(log_dir, exist_ok=True)
    
    # 获取日志级别
    if log_level is None:
        from app.core.config import settings
        log_level = getattr(logging, settings.LOG_LEVEL.upper(), logging.INFO)
    
    # 配置根日志记录器
    root_logger = logging.getLogger()
    root_logger.setLevel(log_level)
    
    # 清除现有的处理器
    root_logger.handlers.clear()
    
    # 创建格式化器
    file_formatter = UTF8Formatter(
        '%(asctime)s - %(name)s - %(levelname)s - %(filename)s:%(lineno)d - %(funcName)s() - %(message)s'
    )
    console_formatter = ColoredFormatter(
        '%(asctime)s - %(levelname)s - %(name)s - %(message)s'
    )
    
    # 文件处理器（轮转）
    # 使用UTF-8编码创建文件处理器
    file_handler = RotatingFileHandler(
        os.path.join(log_dir, 'app.log'),
        maxBytes=10*1024*1024,  # 10MB
        backupCount=10,
        encoding='utf-8'  # 设置为UTF-8编码
    )
    file_handler.setLevel(log_level)
    file_handler.setFormatter(file_formatter)
    
    # 控制台处理器
    console_handler = logging.StreamHandler(sys.stdout)
    console_handler.setLevel(log_level)
    console_handler.setFormatter(console_formatter)
    
    # 添加处理器到根日志记录器
    root_logger.addHandler(file_handler)
    root_logger.addHandler(console_handler)
    
    # 设置第三方库日志级别
    logging.getLogger('sqlalchemy').setLevel(logging.WARNING)
    logging.getLogger('uvicorn').setLevel(logging.INFO)
    logging.getLogger('fastapi').setLevel(logging.INFO)
    
    # 设置性能监控日志级别
    logging.getLogger('app.core.performance_monitor').setLevel(logging.INFO)
    
    # 记录日志系统初始化
    root_logger.info("日志系统初始化完成")
    root_logger.info(f"日志级别: {logging.getLevelName(log_level)}")
    root_logger.info(f"日志文件路径: {os.path.join(log_dir, 'app.log')}")

def get_logger(name: str) -> logging.Logger:
    """获取命名日志记录器
    
    Args:
        name: 日志记录器名称
        
    Returns:
        logging.Logger: 日志记录器实例
    """
    return logging.getLogger(name)